﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cotizav.LogicaNegocio
{
    public class ClienteBLL
    {
        public List<Entidades.Cliente> Listar()
        {
            AccesoDatos.ClienteDAO clienteDAO = new AccesoDatos.ClienteDAO();

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                return clienteDAO.Listar(ctx);
            }
        }

        public Entidades.Cliente ListarCliente(Entidades.Cliente selCliente)
        {
            AccesoDatos.ClienteDAO clienteDAO = new AccesoDatos.ClienteDAO();

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                return clienteDAO.ListarCliente(ctx, selCliente).FirstOrDefault();
            }
        }

        public int Guardar(Entidades.Cliente nuevoCliente)
        {
            if (string.IsNullOrWhiteSpace(nuevoCliente.RucCliente))
            {
                throw new ApplicationException("Ingrese el R.U.C. del cliente");
            }

            if (string.IsNullOrWhiteSpace(nuevoCliente.RazonSocial))
            {
                throw new ApplicationException("Ingrese la Razón Social");
            }

            if (string.IsNullOrWhiteSpace(nuevoCliente.Direccion))
            {
                throw new ApplicationException("Ingrese la dirección");
            }

            if (!nuevoCliente.IdVendedor.HasValue)
            {
                throw new ApplicationException("Seleccione el Vendedor");
            }

            if (string.IsNullOrWhiteSpace(nuevoCliente.Provincia))            
            {
                throw new ApplicationException("Seleccione la provincia");
            }

            if (!nuevoCliente.IdDistrito.HasValue)
            {
                throw new ApplicationException("Seleccione el Distrito");
            }

            if (!nuevoCliente.IdSector.HasValue)
            {
                throw new ApplicationException("Seleccione el Sector");
            }

            if (nuevoCliente.ListContacto.Count == 0)
            {
                throw new ApplicationException("Ingrese por lo mínimo un contacto");
            }

            AccesoDatos.ClienteDAO clienteDAO = new AccesoDatos.ClienteDAO();
            int resultado = 0;

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                ctx.LoadTransaction();
                resultado = clienteDAO.Registrar(ctx, nuevoCliente);

                ContactoBLL contactoBLL = new ContactoBLL();
                foreach (Entidades.Contacto c in nuevoCliente.ListContacto)
                {
                    resultado += contactoBLL.Registrar(ctx, nuevoCliente, c);
                }
                ctx.ConfirmarTx();
            }

            return resultado;
        }

        public List<Entidades.Cliente> Buscar(string argCliente, string valueCliente)
        {
            List<Entidades.Cliente> lista;
            List<Entidades.Cliente> resultado = new List<Entidades.Cliente>();

            if (!string.IsNullOrWhiteSpace(valueCliente))
            {
                lista = Listar();

                switch (argCliente)
                {
                    case "razonSocial":
                        resultado = lista.Where(x => x.RazonSocial.Contains(valueCliente)).OrderBy(x => x.RazonSocial).ToList();
                        break;
                    case "clienteruc":
                        resultado = lista.Where(x => x.RucCliente.Contains(valueCliente)).OrderBy(x => x.RucCliente).ToList();
                        break;
                }
            }
            else
            {
                resultado = Listar();
            }

            return resultado;
        }

        public List<Entidades.Cliente> Listar_Activos()
        {
            return Listar().Where(x => x.Activo == 1).ToList();
        }

        public int Actualizar(Entidades.Cliente updCliente)
        {
            if (string.IsNullOrWhiteSpace(updCliente.RucCliente))
            {
                throw new ApplicationException("Ingrese el R.U.C. del cliente");
            }

            if (string.IsNullOrWhiteSpace(updCliente.RazonSocial))
            {
                throw new ApplicationException("Ingrese la Razón Social");
            }

            if (string.IsNullOrWhiteSpace(updCliente.Direccion))
            {
                throw new ApplicationException("Ingrese la dirección");
            }

            if (!updCliente.IdVendedor.HasValue)
            {
                throw new ApplicationException("Seleccione el Vendedor");
            }

            if (string.IsNullOrWhiteSpace(updCliente.Provincia))
            {
                throw new ApplicationException("Seleccione la provincia");
            }

            if (!updCliente.IdDistrito.HasValue)
            {
                throw new ApplicationException("Seleccione el Distrito");
            }

            if (!updCliente.IdSector.HasValue)
            {
                throw new ApplicationException("Seleccione el Sector");
            }

            if (updCliente.ListContacto.Count == updCliente.ListContacto.Where(x => x.Statusflag == "E").Count())
            {
                throw new ApplicationException("Ingrese por lo mínimo un contacto");
            }

            AccesoDatos.ClienteDAO clienteDAO = new AccesoDatos.ClienteDAO();
            int resultado = 0;

            List<Entidades.Contacto> List_Insert_Contacto = updCliente.ListContacto.Where(x => x.Statusflag == "I").ToList();
            List<Entidades.Contacto> List_Update_Contacto = updCliente.ListContacto.Where(x => x.Statusflag == "U").ToList();
            List<Entidades.Contacto> List_Delete_Contacto = updCliente.ListContacto.Where(x => x.Statusflag == "D").ToList();

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                ctx.LoadTransaction();
                resultado = clienteDAO.Actualizar(ctx, updCliente);

                ContactoBLL contactoBLL = new ContactoBLL();

                foreach (Entidades.Contacto c in List_Insert_Contacto)
                {
                    resultado += contactoBLL.Registrar(ctx, updCliente, c);
                }

                foreach (Entidades.Contacto c in List_Update_Contacto)
                {
                    resultado += contactoBLL.Actualizar(ctx, c);
                }

                foreach (Entidades.Contacto c in List_Delete_Contacto)
                {
                    resultado += contactoBLL.Eliminar(ctx, c);
                }

                ctx.ConfirmarTx();

                return resultado;
            }
        }

        public int Eliminar(Entidades.Cliente selectedCliente)
        {
            AccesoDatos.ClienteDAO clienteDAO = new AccesoDatos.ClienteDAO();
            int resultado = 0;

            using (Util.ContextoDB ctx = Util.ContextoDB.GetContexto())
            {
                resultado = clienteDAO.Eliminar(ctx, selectedCliente);
            }

            return resultado;
        }
    }
}
